package com.cencat.order.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.cencat.order.entity.OrderItem;
import com.cencat.order.dto.OrderItemCreateDTO;
import com.cencat.order.dto.OrderItemUpdateDTO;
import com.cencat.order.vo.OrderItemVO;
import com.cencat.order.vo.ProductSalesVO;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 订单明细服务接口
 * 
 * @author cencat
 * @since 2024-01-20
 */
public interface OrderItemService extends IService<OrderItem> {

    /**
     * 创建订单明细
     * 
     * @param orderItemCreateDTO 订单明细创建DTO
     * @return 订单明细
     */
    OrderItemVO createOrderItem(OrderItemCreateDTO orderItemCreateDTO);

    /**
     * 批量创建订单明细
     * 
     * @param orderId 订单ID
     * @param orderItemCreateDTOs 订单明细创建DTO列表
     * @return 订单明细列表
     */
    List<OrderItemVO> batchCreateOrderItems(Long orderId, List<OrderItemCreateDTO> orderItemCreateDTOs);

    /**
     * 更新订单明细
     * 
     * @param itemId 明细ID
     * @param orderItemUpdateDTO 订单明细更新DTO
     * @return 是否成功
     */
    boolean updateOrderItem(Long itemId, OrderItemUpdateDTO orderItemUpdateDTO);

    /**
     * 批量更新订单明细
     * 
     * @param orderItemUpdateDTOs 订单明细更新DTO列表
     * @return 是否成功
     */
    boolean batchUpdateOrderItems(List<OrderItemUpdateDTO> orderItemUpdateDTOs);

    /**
     * 删除订单明细
     * 
     * @param itemId 明细ID
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean deleteOrderItem(Long itemId, Long operatorId);

    /**
     * 根据订单ID删除订单明细
     * 
     * @param orderId 订单ID
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean deleteOrderItemsByOrderId(Long orderId, Long operatorId);

    /**
     * 根据订单ID查询订单明细列表
     * 
     * @param orderId 订单ID
     * @return 订单明细列表
     */
    List<OrderItemVO> getOrderItemsByOrderId(Long orderId);

    /**
     * 根据订单ID列表查询订单明细
     * 
     * @param orderIds 订单ID列表
     * @return 订单明细列表
     */
    List<OrderItemVO> getOrderItemsByOrderIds(List<Long> orderIds);

    /**
     * 根据产品ID查询订单明细
     * 
     * @param productId 产品ID
     * @return 订单明细列表
     */
    List<OrderItemVO> getOrderItemsByProductId(Long productId);

    /**
     * 计算订单明细总金额
     * 
     * @param orderId 订单ID
     * @return 总金额
     */
    BigDecimal calculateOrderItemsTotalAmount(Long orderId);

    /**
     * 计算订单明细总数量
     * 
     * @param orderId 订单ID
     * @return 总数量
     */
    Integer calculateOrderItemsTotalQuantity(Long orderId);

    /**
     * 统计产品销量
     * 
     * @param productId 产品ID（可选）
     * @param merchantId 商家ID（可选）
     * @return 销量统计列表
     */
    List<ProductSalesVO> getProductSalesStatistics(Long productId, Long merchantId);

    /**
     * 查询热销产品
     * 
     * @param merchantId 商家ID（可选）
     * @param limit 限制数量
     * @return 热销产品列表
     */
    List<ProductSalesVO> getHotProducts(Long merchantId, Integer limit);

    /**
     * 查询用户购买历史
     * 
     * @param userId 用户ID
     * @param productId 产品ID（可选）
     * @return 购买历史
     */
    List<Map<String, Object>> getUserPurchaseHistory(Long userId, Long productId);

    /**
     * 检查用户是否购买过某产品
     * 
     * @param userId 用户ID
     * @param productId 产品ID
     * @return 是否购买过
     */
    boolean checkUserPurchased(Long userId, Long productId);

    /**
     * 更新订单明细备注
     * 
     * @param itemId 明细ID
     * @param remark 备注
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean updateOrderItemRemark(Long itemId, String remark, Long operatorId);

    /**
     * 验证订单明细数据
     * 
     * @param orderItemCreateDTO 订单明细创建DTO
     * @return 验证结果
     */
    boolean validateOrderItemData(OrderItemCreateDTO orderItemCreateDTO);

    /**
     * 计算订单明细小计金额
     * 
     * @param quantity 数量
     * @param unitPrice 单价
     * @param discountAmount 优惠金额
     * @return 小计金额
     */
    BigDecimal calculateSubtotal(Integer quantity, BigDecimal unitPrice, BigDecimal discountAmount);

    /**
     * 同步订单明细到库存系统
     * 
     * @param orderItems 订单明细列表
     * @param operationType 操作类型（CREATE/UPDATE/DELETE）
     * @return 是否成功
     */
    boolean syncOrderItemsToInventory(List<OrderItem> orderItems, String operationType);

    /**
     * 检查库存是否充足
     * 
     * @param productId 产品ID
     * @param quantity 需要数量
     * @return 是否充足
     */
    boolean checkInventoryAvailable(Long productId, Integer quantity);

    /**
     * 预占库存
     * 
     * @param orderItems 订单明细列表
     * @return 是否成功
     */
    boolean reserveInventory(List<OrderItem> orderItems);

    /**
     * 释放库存
     * 
     * @param orderItems 订单明细列表
     * @return 是否成功
     */
    boolean releaseInventory(List<OrderItem> orderItems);

    /**
     * 扣减库存
     * 
     * @param orderItems 订单明细列表
     * @return 是否成功
     */
    boolean deductInventory(List<OrderItem> orderItems);

    /**
     * 恢复库存
     * 
     * @param orderItems 订单明细列表
     * @return 是否成功
     */
    boolean restoreInventory(List<OrderItem> orderItems);
}